package top.zywork.service;

import top.zywork.dto.RefundOrderDTO;
import top.zywork.enums.FundsChangeTypeEnum;
import top.zywork.vo.ResponseStatusVO;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 支付服务接口。一般情况下建议先生成支付订单，再发起支付<br/>
 *
 * 创建于2019-01-15<br/>
 *
 * @author 王振宇
 * @version 1.0
 */
public interface PayService {

    /**
     * 使用余额支付，没有考虑支付完成后对其他表的操作（事务），实际使用中，请基于此实现再次实现对应场景下的余额支付
     * @param userId 用户编号
     * @param transactionNo 交易编号
     * @param totalFee 支付金额，单位为分
     * @param userFundsChangeTypeEnum 用户资金变动类型枚举
     * @param platformFundsChangeType 平台资金变动类型枚举
     * @param accountRemark 账目备注
     * @return
     */
    ResponseStatusVO payByBalance(Long userId, String transactionNo, int totalFee, FundsChangeTypeEnum userFundsChangeTypeEnum, FundsChangeTypeEnum platformFundsChangeType, String accountRemark);

    /**
     * 微信公众号支付
     * @param openid 用户openid
     * @param orderNo 订单号
     * @param ip 调用接口的ip地址
     * @param body 订单主体信息
     * @param attach 订单附加信息
     * @param totalFee 支付金额，单位为分
     * @param payNotifyUrl 支付回调url
     * @return
     */
    ResponseStatusVO payByGzhWxpay(String openid, String orderNo, String ip, String body, String attach, int totalFee, String payNotifyUrl);

    /**
     * 微信公众号支付，带优惠券
     * @param openid 用户openid
     * @param orderNo 订单号
     * @param ip 调用接口的ip地址
     * @param body 订单主体信息
     * @param detail 商品详情
     * @param attach 订单附加信息
     * @param totalFee 支付金额，单位为分
     * @param goodsTag 优惠券标记
     * @param payNotifyUrl 支付回调url
     * @return
     */
    ResponseStatusVO payByGzhWxpayCoupon(String openid, String orderNo, String ip, String body, String detail, String attach, int totalFee, String goodsTag, String payNotifyUrl);

    /**
     * 微信小程序支付
     * @param openid 用户openid
     * @param orderNo 订单号
     * @param ip 调用接口的ip地址
     * @param body 订单主体信息
     * @param attach 订单附加信息
     * @param totalFee 支付金额，单位为分
     * @param payNotifyUrl 支付回调url
     * @return
     */
    ResponseStatusVO payByXcxWxpay(String openid, String orderNo, String ip, String body, String attach, int totalFee, String payNotifyUrl);

    /**
     * 微信小程序支付，带优惠券
     * @param openid 用户openid
     * @param orderNo 订单号
     * @param ip 调用接口的ip地址
     * @param body 订单主体信息
     * @param detail 商品详情
     * @param attach 订单附加信息
     * @param totalFee 支付金额，单位为分
     * @param goodsTag 优惠券标记
     * @param payNotifyUrl 支付回调url
     * @return
     */
    ResponseStatusVO payByXcxWxpayCoupon(String openid, String orderNo, String ip, String body, String detail, String attach, int totalFee, String goodsTag, String payNotifyUrl);

    /**
     * 微信支付回调方法
     * @param request
     * @param response
     * @param payNotifyService
     * @return
     */
    void payByWxNotify(String type,HttpServletRequest request, HttpServletResponse response, PayNotifyService payNotifyService);

    /**
     * 微信公众号退款
     * @param transactionNo 微信支付订单号
     * @param outRefundNo 退款商户号
     * @param totalFee 微信支付订单金额，单位为分
     * @param refundFee 退款金额，单位为分
     * @param refundDesc 退款描述
     * @param refundNotifyUrl 退款回调url
     * @return
     */
    ResponseStatusVO refundByGzhWxpay(String transactionNo, String outRefundNo, int totalFee, int refundFee, String refundDesc, String refundNotifyUrl);

    /**
     * 微信小程序退款
     *
     * @return
     */
    ResponseStatusVO refundByXcxWxpay(RefundOrderDTO refundOrderDTO);

    /**
     * 微信退款回调方法
     * @param request
     * @param response
     * @param payNotifyService
     * @return
     */
    void refundByWxNotify(String type,HttpServletRequest request, HttpServletResponse response, PayNotifyService payNotifyService);

    /**
     * 支付宝支付
     * @return
     */
    ResponseStatusVO payByAlipay();

    /**
     * 银联支付
     * @return
     */
    ResponseStatusVO payByUnionpay();

    /**
     * 平台通过余额方式转账到个人
     * @param userId 收款方用户编号
     * @param transactionNo 交易编号
     * @param totalFee 支付总金额， 单位为分
     * @param userFundsChangeTypeEnum 用户资金变动类型
     * @param platformFundsChangeType 平台资金变动类型
     * @param accountRemark 账目备注
     * @return
     */
    public ResponseStatusVO transferByBalance(Long userId, String transactionNo, int totalFee, FundsChangeTypeEnum userFundsChangeTypeEnum, FundsChangeTypeEnum platformFundsChangeType, String accountRemark);

    /**
     * 平台微信公众号端发送普通红包
     * @param userId 用户编号
     * @param openid 用户openid
     * @param billNo 商户订单号
     * @param ip 调用接口的ip地址
     * @param sendName 发送名称，如**公司
     * @param totalAmount 发送金额，普通红包1-200元
     * @param totalNum 发送人数
     * @param wishing 祝福语
     * @param actName 活动名称
     * @param remark 备注
     * @param sceneId 普通红包不需要传，非普通红包必传（小于1元或大于200即为非普通红包），参考RedpackSceneEnum枚举
     * @param userFundsChangeTypeEnum 用户资金变动枚举
     * @param platformFundsChangeType 平台资金变动枚举
     * @return
     */
    ResponseStatusVO sendRedpackByGzh(Long userId, String openid, String billNo, String ip, String sendName, int totalAmount,
                                      int totalNum, String wishing, String actName, String remark, String sceneId,
                                      FundsChangeTypeEnum userFundsChangeTypeEnum, FundsChangeTypeEnum platformFundsChangeType);

    /**
     * 平台微信企业付款到个人，通过公众号付款，需要记录账目详情变化
     * @param userId 用户编号
     * @param openid 用户openid
     * @param ip 调用接口的ip地址
     * @param partnerTradeNo 商户订单号
     * @param amount 支付总金额
     * @param checkName 是否校验真实姓名
     * @param desc 付款备注
     * @param accountRemark 资金变动备注
     * @param userFundsChangeTypeEnum 用户资金变动枚举
     * @param platformFundsChangeType 平台资金变动枚举
     * @return
     */
    ResponseStatusVO transferToPersonalGzh(Long userId, String openid, String ip, String partnerTradeNo, int amount,
                                           String checkName, String desc, String accountRemark,
                                           FundsChangeTypeEnum userFundsChangeTypeEnum, FundsChangeTypeEnum platformFundsChangeType);

    /**
     * 平台微信企业付款到个人，通过小程序付款，需要记录账目详情变化
     * @param userId 用户编号
     * @param openid 用户openid
     * @param ip 调用接口的ip地址
     * @param partnerTradeNo 商户订单号
     * @param amount 支付总金额
     * @param checkName 是否校验真实姓名
     * @param desc 付款备注
     * @param accountRemark 资金变动备注
     * @param userFundsChangeTypeEnum 用户资金变动枚举
     * @param platformFundsChangeType 平台资金变动枚举
     * @return
     */
    ResponseStatusVO transferToPersonalXcx(Long userId, String openid, String ip, String partnerTradeNo, int amount,
                                           String checkName, String desc, String accountRemark,
                                           FundsChangeTypeEnum userFundsChangeTypeEnum, FundsChangeTypeEnum platformFundsChangeType);

    /**
     * 人工提现到银行卡
     * @param userId 用户编号
     * @param transactionNo 提现交易号
     * @param amount 支付总金额
     * @param accountRemark 账目说明
     * @return
     */
    ResponseStatusVO withdrawToBankcardHuman(Long userId, String transactionNo, int amount, String accountRemark);

    /**
     * 用户提现，平台微信企业付款到个人，通过公众号付款，不需要记录账目详情变化
     * @param userId 用户编号
     * @param openid 用户openid
     * @param ip 调用接口的ip地址
     * @param partnerTradeNo 商户订单号
     * @param amount 支付总金额
     * @param checkName 是否校验真实姓名
     * @param desc 付款备注
     * @param accountRemark 账目描述
     * @return
     */
    ResponseStatusVO withdrawToPersonalGzh(Long userId, String openid, String ip, String partnerTradeNo, int amount, String checkName, String desc, String accountRemark);

    /**
     * 用户提现，平台微信企业付款到个人，通过小程序付款，不需要记录账目详情变化
     * @param userId 用户编号
     * @param openid 用户openid
     * @param ip 调用接口的ip地址
     * @param partnerTradeNo 商户订单号
     * @param amount 支付总金额
     * @param checkName 是否校验真实姓名
     * @param desc 付款备注
     * @param accountRemark 账目描述
     * @return
     */
    ResponseStatusVO withdrawToPersonalXcx(Long userId, String openid, String ip, String partnerTradeNo, int amount, String checkName, String desc, String accountRemark);

}
